
#include <linux/bpf.h>
#include <linux/if_ether.h>

#define MAX_SEG_LIST 2
#define MAX_CIDR 4


//每个path中间转发节点（包括封装和解封装节点）最大数量
#define MAX_NODE_NUM 10
//每个节点SID最大数量
#define MAX_SID_NUM 10
//网络中最大路径数量
#define MAX_PATH_NUM 100 
//网络中最大网络流数量
#define MAX_FLOW_NUM 100
//程序中MAP的最大数量,当前用到4个
#define MAX_MAP_NUM 10
//程序中redirect的最大数量，理论上是网络中所有SID的数量
#define MAX_REDIRECT_NUM 100
// 单节点ARP条目最大数量
#define MAX_ARP_NUM 100

struct SID 
{
  __u32 valid;
  __u32 action;
  __u32 ipv4;
};

/**
 * 一条路径的ip序列从source node的下一个node开始，到sink node
 * 报文到达source后，首先触发ENCAP指令，source查找path，封装SRH
 * sink接收后，触发DENCAP指令，解封装，恢复原始报文
 * 路径的最后一个IP是sink的DENCAP指令
 * 报文源节点发出时，目的IP为source的ENCAP指令
 */
struct PATH 
{
  __u32 valid;
  __u32 id;
  __u32 num; //记录ipv4数组中有效IP的数量
  __u32 ipv4[MAX_NODE_NUM];
};

struct FLOW 
{
	__u32 valid;
	__u32 id;
	// ms单位的报文传输有效时间，0时标识无传输有效时间
	__u32 timeout;
	__u32 proto;
	__u32 src_port;
	__u32 dst_port;
	__u32 src_ipv4;
	__u32 dst_ipv4;
};

struct REDIRECT
{
	__u32 valid;
	__u32 ipv4;
	__u32 egr_ifi;
	__u8  eth_source[ETH_ALEN]; // 封装帧的源MAC地址。
	__u8  eth_dest[ETH_ALEN]; // 封装帧的目标MAC地址。
};

// 报文传输超时处理的TLV
struct TLV_TIMEOUT
{
	__u8 type;
	__u8 length;
	// 传输有效时间，us
	__u16 timeout;
	// 传输开始时间，源节点封装时设置，us
	__u32 start;
};

// 记录本地接口MAC地址
struct MAC
{
	__u8 mac[ETH_ALEN];
};

// ARP转发表项
struct ARP
{
	__u32 valid;
	int ifindex; // 转发出去的接口
	__u32 ip; // dest ip, after htonl()
	__u8  eth_source[ETH_ALEN]; // 封装帧的源MAC地址。
	__u8  eth_dest[ETH_ALEN]; // 封装帧的目标MAC地址。
};



enum ACTION 
{
  PASS,
  END,
  ENCAP,
  DENCAP
};

enum MAPTYPE
{
	SID_MAP,
	PATH_MAP,
	FLOW_MAP
};


